0031313: Foundation Classes - Dump improvement for classes
[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-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 // Modified by rmi, Tue Nov 18 08:17:41 1997
18
19 #include <CDM_Application.hxx>
20 #include <CDM_DataMapIteratorOfMetaDataLookUpTable.hxx>
21 #include <CDM_Document.hxx>
22 #include <CDM_ListIteratorOfListOfDocument.hxx>
23 #include <CDM_ListOfDocument.hxx>
24 #include <CDM_MetaData.hxx>
25 #include <CDM_NamesDirectory.hxx>
26 #include <CDM_PresentationDirectory.hxx>
27 #include <CDM_Reference.hxx>
28 #include <CDM_ReferenceIterator.hxx>
29 #include <Resource_Manager.hxx>
30 #include <Standard_DomainError.hxx>
31 #include <Standard_Dump.hxx>
32 #include <Standard_Failure.hxx>
33 #include <Standard_GUID.hxx>
34 #include <Standard_NoSuchObject.hxx>
35 #include <Standard_NullObject.hxx>
36 #include <Standard_ProgramError.hxx>
37 #include <Standard_Type.hxx>
38 #include <TCollection_ExtendedString.hxx>
39 #include <UTL.hxx>
40
41 IMPLEMENT_STANDARD_RTTIEXT(CDM_Document,Standard_Transient)
42
43 static CDM_PresentationDirectory& getPresentations() {
44   static CDM_PresentationDirectory thePresentations;
45   return thePresentations;
46 }
47
48 //=======================================================================
49 //function : CDM_Document
50 //purpose  : 
51 //=======================================================================
52
53 CDM_Document::CDM_Document():
54   myResourcesAreLoaded          (Standard_False),
55   myValidPresentation           (Standard_False),
56   myVersion                     (1),
57   myActualReferenceIdentifier   (0),
58   myStorageVersion              (0),
59   myRequestedComment            (""),
60   myRequestedFolderIsDefined    (Standard_False),
61   myRequestedNameIsDefined      (Standard_False),
62   myRequestedPreviousVersionIsDefined(Standard_False),
63   myFileExtensionWasFound       (Standard_False),
64   myDescriptionWasFound         (Standard_False),
65   myStorageFormatVersion        (0)
66 {}
67
68
69 //=======================================================================
70 //function : ~CDM_Document
71 //purpose  : 
72 //=======================================================================
73
74 CDM_Document::~CDM_Document()
75 {
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     throw Standard_NoSuchObject("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     throw Standard_NoSuchObject("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     throw Standard_DomainError("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 0;
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
557   if(!myMetaData.IsNull()) {
558     presentation += myMetaData->Name();
559     if(!theNames.IsBound(presentation)) theNames.Bind(presentation,0);
560     Standard_Integer range = theNames(presentation);
561     range += 1;
562     theNames(presentation) = range;
563     if(range != 1) {
564       presentation += "<";
565       presentation += range;
566       presentation += ">";
567     }
568   }
569   else {
570     presentation = "Document_";
571     presentation += ++theUnnamedDocuments;
572   }
573   
574   if(getPresentations().IsBound(presentation)) {
575     TCollection_ExtendedString Test = presentation;
576     Test += "!";
577     Standard_Integer Count=0;
578     while (getPresentations().IsBound(Test)) {
579       Count++;
580       Test = presentation; Test+= "!"; Test+= Count;
581     }
582     presentation = Test;
583   }
584   
585   
586   myPresentation = TCollection_ExtendedString(presentation);
587   myValidPresentation = Standard_True;
588   getPresentations().Bind(presentation,this);
589 }
590
591 //=======================================================================
592 //function : FindFromPresentation
593 //purpose  : 
594 //=======================================================================
595
596 Handle(CDM_Document) CDM_Document::FindFromPresentation
597                                 (const TCollection_ExtendedString& aPresentation)
598 {
599   TCollection_ExtendedString x(aPresentation);
600   if(!getPresentations().IsBound(x)) {
601     Standard_SStream aMsg;
602     aMsg <<"No document having this presentation: " << x << " does exist."
603          << std::endl << (char)0;
604     throw Standard_NoSuchObject(aMsg.str().c_str());
605   }
606   return getPresentations()(x);
607 }
608
609 //=======================================================================
610 //function : FindPresentation
611 //purpose  : 
612 //=======================================================================
613
614 Standard_Boolean CDM_Document::FindPresentation
615                                 (const TCollection_ExtendedString& aPresentation)
616 {
617   return getPresentations().IsBound(aPresentation);
618 }
619
620 //=======================================================================
621 //function : IsStored
622 //purpose  : 
623 //=======================================================================
624
625 Standard_Boolean CDM_Document::IsStored() const
626 {
627   return !myMetaData.IsNull();
628 }
629
630 //=======================================================================
631 //function : StorageVersion
632 //purpose  : 
633 //=======================================================================
634
635 Standard_Integer CDM_Document::StorageVersion() const
636 {
637   return myStorageVersion;
638 }
639
640 //=======================================================================
641 //function : SetMetaData
642 //purpose  : 
643 //=======================================================================
644
645 void CDM_Document::SetMetaData(const Handle(CDM_MetaData)& aMetaData)
646 {
647   if(!aMetaData->IsRetrieved() || aMetaData->Document() != This()) {
648
649     aMetaData->SetDocument(this);
650
651 // Update the document refencing this MetaData:
652     CDM_DataMapIteratorOfMetaDataLookUpTable it(CDM_MetaData::LookUpTable());
653     for(;it.More();it.Next()) {
654       const Handle(CDM_MetaData)& theMetaData=it.Value();
655       if(theMetaData != aMetaData && theMetaData->IsRetrieved()) {
656         CDM_ListIteratorOfListOfReferences rit(theMetaData->Document()->myToReferences);
657         for(;rit.More();rit.Next()) {
658           rit.Value()->Update(aMetaData);
659         }
660       }
661     }
662     if(!myMetaData.IsNull()) {
663       if(myMetaData->Name() != aMetaData->Name()) UnvalidPresentation();
664       myMetaData->UnsetDocument();
665     }
666     else
667       UnvalidPresentation();
668   }
669
670   myStorageVersion = Modifications();
671   
672   myMetaData = aMetaData;
673   
674   SetRequestedFolder(aMetaData->Folder());
675   if(aMetaData->HasVersion()) SetRequestedPreviousVersion(aMetaData->Version());
676 }
677
678 //=======================================================================
679 //function : UnsetIsStored
680 //purpose  : 
681 //=======================================================================
682
683 void CDM_Document::UnsetIsStored()
684 {
685   if(!myMetaData.IsNull()) { 
686     myMetaData->UnsetDocument();
687 //    myMetaData.Nullify();
688   }
689 }
690
691 //=======================================================================
692 //function : MetaData
693 //purpose  : 
694 //=======================================================================
695
696 Handle(CDM_MetaData) CDM_Document::MetaData() const
697 {
698   if(myMetaData.IsNull())
699     throw Standard_NoSuchObject("cannot furnish the MetaData of an object "
700                                  "which is not stored");
701   return myMetaData;
702 }
703
704 //=======================================================================
705 //function : SetRequestedComment
706 //purpose  : 
707 //=======================================================================
708
709 void CDM_Document::SetRequestedComment(const TCollection_ExtendedString& aComment)
710 {
711   myRequestedComment=aComment;
712 }
713
714 //=======================================================================
715 //function : RequestedComment
716 //purpose  : 
717 //=======================================================================
718
719 TCollection_ExtendedString CDM_Document::RequestedComment() const
720 {
721   return myRequestedComment.ToExtString();
722 }
723
724 //=======================================================================
725 //function : Folder
726 //purpose  : 
727 //=======================================================================
728
729 TCollection_ExtendedString CDM_Document::Folder() const {
730   if(myMetaData.IsNull())
731     throw Standard_NoSuchObject("cannot furnish the folder of an object "
732                                  "which is not stored");
733   return myMetaData->Folder();
734 }
735
736 //=======================================================================
737 //function : SetRequestedFolder
738 //purpose  : 
739 //=======================================================================
740
741 void CDM_Document::SetRequestedFolder(const TCollection_ExtendedString& aFolder)
742 {
743   TCollection_ExtendedString f(aFolder);
744   if(f.Length() != 0) {
745     myRequestedFolderIsDefined=Standard_True;
746     myRequestedFolder=aFolder;
747   }
748 }
749
750 //=======================================================================
751 //function : RequestedFolder
752 //purpose  : 
753 //=======================================================================
754
755 TCollection_ExtendedString CDM_Document::RequestedFolder() const
756 {
757   Standard_NoSuchObject_Raise_if (!myRequestedFolderIsDefined,
758                                   "storage folder is undefined for this document");
759   return myRequestedFolder;
760 }
761
762 //=======================================================================
763 //function : HasRequestedFolder
764 //purpose  : 
765 //=======================================================================
766
767 Standard_Boolean CDM_Document::HasRequestedFolder() const
768 {
769   return myRequestedFolderIsDefined;
770 }
771
772 //=======================================================================
773 //function : SetRequestedName
774 //purpose  : 
775 //=======================================================================
776
777 void CDM_Document::SetRequestedName(const TCollection_ExtendedString& aName)
778 {
779   myRequestedName=aName;
780   myRequestedNameIsDefined=Standard_True;
781 }
782
783 //=======================================================================
784 //function : RequestedName
785 //purpose  : 
786 //=======================================================================
787
788 TCollection_ExtendedString CDM_Document::RequestedName()
789 {
790   if(!myRequestedNameIsDefined) {
791     if(!myMetaData.IsNull())
792       myRequestedName=myMetaData->Name();
793     else
794       myRequestedName=Presentation();
795   }
796   myRequestedNameIsDefined=Standard_True;
797   return myRequestedName;
798 }
799
800 //=======================================================================
801 //function : SetRequestedPreviousVersion
802 //purpose  : 
803 //=======================================================================
804
805 void CDM_Document::SetRequestedPreviousVersion
806                              (const TCollection_ExtendedString& aPreviousVersion)
807 {
808   myRequestedPreviousVersionIsDefined=Standard_True;
809   myRequestedPreviousVersion=aPreviousVersion;
810 }
811
812 //=======================================================================
813 //function : RequestedPreviousVersion
814 //purpose  : 
815 //=======================================================================
816
817 TCollection_ExtendedString CDM_Document::RequestedPreviousVersion() const
818 {
819   Standard_NoSuchObject_Raise_if (!myRequestedPreviousVersionIsDefined,
820                                   "PreviousVersion is undefined fro this document");
821   return myRequestedPreviousVersion;
822 }
823
824 //=======================================================================
825 //function : HasRequestedPreviousVersion
826 //purpose  : 
827 //=======================================================================
828
829 Standard_Boolean CDM_Document::HasRequestedPreviousVersion() const
830 {
831   return myRequestedPreviousVersionIsDefined;
832 }
833
834 //=======================================================================
835 //function : UnsetRequestedPreviousVersion
836 //purpose  : 
837 //=======================================================================
838
839 void CDM_Document::UnsetRequestedPreviousVersion()
840 {
841   myRequestedPreviousVersionIsDefined=Standard_False;
842 }
843
844 //=======================================================================
845 //function : IsOpened
846 //purpose  : 
847 //=======================================================================
848
849 Standard_Boolean CDM_Document::IsOpened() const
850 {
851   return !myApplication.IsNull();
852 }
853
854 //=======================================================================
855 //function : IsOpened
856 //purpose  : 
857 //=======================================================================
858
859 Standard_Boolean CDM_Document::IsOpened
860                                 (const Standard_Integer aReferenceIdentifier) const
861 {
862   CDM_ListIteratorOfListOfReferences it(myToReferences);
863   
864   for (; it.More(); it.Next()) {
865     if (aReferenceIdentifier == it.Value()->ReferenceIdentifier())
866       return it.Value()->IsOpened();
867   }
868   return Standard_False;
869 }
870
871 //=======================================================================
872 //function : Open
873 //purpose  : 
874 //=======================================================================
875
876 void CDM_Document::Open(const Handle(CDM_Application)& anApplication)
877 {
878   myApplication=anApplication;
879 }
880
881 //=======================================================================
882 //function : Close
883 //purpose  : 
884 //=======================================================================
885
886 void CDM_Document::Close()
887 {
888   switch (CanClose()) {
889   case CDM_CCS_NotOpen: 
890     throw Standard_Failure("cannot close a document that has not been opened");
891     break;
892   case CDM_CCS_UnstoredReferenced:
893      throw Standard_Failure("cannot close an unstored document which is referenced");
894     break;
895   case CDM_CCS_ModifiedReferenced:
896     throw Standard_Failure("cannot close a document which is referenced when "
897                             "the document has been modified since it was stored.");
898     break;
899   case CDM_CCS_ReferenceRejection:
900     throw Standard_Failure("cannot close this document because a document "
901                             "referencing it refuses");
902     break;
903   default:
904     break;
905   }
906   if(FromReferencesNumber() != 0) {
907     CDM_ListIteratorOfListOfReferences it(myFromReferences);
908     for(; it.More(); it.Next()) {
909       it.Value()->UnsetToDocument(MetaData(),myApplication);
910     }
911   }
912   RemoveAllReferences();
913   UnsetIsStored();
914   myApplication.Nullify();
915   UnvalidPresentation();
916
917 }
918
919 //=======================================================================
920 //function : CanClose
921 //purpose  : 
922 //=======================================================================
923
924 CDM_CanCloseStatus CDM_Document::CanClose() const
925 {
926   if(!IsOpened()) return CDM_CCS_NotOpen;
927
928   if(FromReferencesNumber() != 0) {
929     if(!IsStored()) return CDM_CCS_UnstoredReferenced;
930     if(IsModified()) return CDM_CCS_ModifiedReferenced;
931
932
933     CDM_ListIteratorOfListOfReferences it(myFromReferences);
934     for(; it.More(); it.Next()) {
935       if(!it.Value()->FromDocument()->CanCloseReference(this, it.Value()->ReferenceIdentifier()))
936         return CDM_CCS_ReferenceRejection;
937     }
938   } 
939   return CDM_CCS_OK;
940 }
941
942 //=======================================================================
943 //function : CanCloseReference
944 //purpose  : 
945 //=======================================================================
946
947 Standard_Boolean CDM_Document::CanCloseReference
948                                 (const Handle(CDM_Document)& /*aDocument*/,
949                                  const Standard_Integer /*(aReferenceIdent*/) const
950 {
951   return Standard_True;
952 }
953
954 //=======================================================================
955 //function : CloseReference
956 //purpose  : 
957 //=======================================================================
958
959 void CDM_Document::CloseReference (const Handle(CDM_Document)& /*aDocument*/,
960                                    const Standard_Integer /*aReferenceIdentifier*/)
961 {
962 }
963
964 //=======================================================================
965 //function : Application
966 //purpose  : 
967 //=======================================================================
968
969 const Handle(CDM_Application)& CDM_Document::Application() const
970 {
971   if(!IsOpened())
972     throw Standard_Failure("this document has not yet been opened "
973                             "by any application");
974   return myApplication;
975 }
976
977 //=======================================================================
978 //function : IsModified
979 //purpose  : 
980 //=======================================================================
981
982 Standard_Boolean CDM_Document::IsModified() const
983 {
984   return Modifications() > StorageVersion();
985 }
986
987 //=======================================================================
988 //function : Print
989 //purpose  : 
990 //=======================================================================
991
992 Standard_OStream& CDM_Document::Print(Standard_OStream& anOStream) const
993 {
994   return anOStream;
995 }
996
997 //=======================================================================
998 //function : CreateReference
999 //purpose  : 
1000 //=======================================================================
1001
1002 void CDM_Document::CreateReference(const Handle(CDM_MetaData)& aMetaData,
1003                                    const Standard_Integer aReferenceIdentifier,
1004                                    const Handle(CDM_Application)& anApplication,
1005                                    const Standard_Integer aToDocumentVersion,
1006                                    const Standard_Boolean UseStorageConfiguration)
1007 {
1008   myActualReferenceIdentifier=Max(myActualReferenceIdentifier,aReferenceIdentifier);
1009
1010   if(aMetaData->IsRetrieved()) {
1011     Handle(CDM_Reference) r = new CDM_Reference (this,
1012                                                  aMetaData->Document(),
1013                                                  aReferenceIdentifier,
1014                                                  aToDocumentVersion);
1015     AddToReference(r);
1016     aMetaData->Document()->AddFromReference(r);
1017     
1018   }
1019   else  {
1020       Handle(CDM_Reference) r = new CDM_Reference (this,
1021                                                    aMetaData,
1022                                                    aReferenceIdentifier,
1023                                                    anApplication,
1024                                                    aToDocumentVersion,
1025                                                    UseStorageConfiguration);
1026       AddToReference(r);
1027     }
1028 }
1029
1030 //=======================================================================
1031 //function : CreateReference
1032 //purpose  : 
1033 //=======================================================================
1034
1035 Standard_Integer CDM_Document::CreateReference
1036                                 (const Handle(CDM_MetaData)& aMetaData,
1037                                  const Handle(CDM_Application)& anApplication,
1038                                  const Standard_Integer aDocumentVersion,
1039                                  const Standard_Boolean UseStorageConfiguration)
1040 {
1041   CDM_ListIteratorOfListOfReferences it(myToReferences);
1042
1043   for(; it.More(); it.Next()) {
1044     if(aMetaData == it.Value()->MetaData())
1045       return it.Value()->ReferenceIdentifier();
1046   }
1047   Handle(CDM_Reference) r = new CDM_Reference (this,
1048                                                aMetaData,
1049                                                ++myActualReferenceIdentifier,
1050                                                anApplication,
1051                                                aDocumentVersion,
1052                                                UseStorageConfiguration);
1053   AddToReference(r);
1054   return  r->ReferenceIdentifier();
1055 }
1056
1057 //=======================================================================
1058 //function : AddToReference
1059 //purpose  : 
1060 //=======================================================================
1061
1062 void CDM_Document::AddToReference(const Handle(CDM_Reference)& aReference)
1063 {
1064   myToReferences.Append(aReference);
1065 }
1066
1067 //=======================================================================
1068 //function : AddFromReference
1069 //purpose  : 
1070 //=======================================================================
1071
1072 void CDM_Document::AddFromReference(const Handle(CDM_Reference)& aReference)
1073 {
1074   myFromReferences.Append(aReference);
1075 }
1076
1077 //=======================================================================
1078 //function : RemoveFromReference
1079 //purpose  : 
1080 //=======================================================================
1081
1082 void CDM_Document::RemoveFromReference(const Standard_Integer aReferenceIdentifier)
1083 {
1084   CDM_ListIteratorOfListOfReferences it(myFromReferences);
1085   
1086   for(; it.More(); it.Next()) {
1087     if(aReferenceIdentifier == it.Value()->ReferenceIdentifier()) {
1088       myFromReferences.Remove(it);
1089       return;
1090     }
1091   }
1092 }
1093
1094 //=======================================================================
1095 //function : GetResource
1096 //purpose  : 
1097 //=======================================================================
1098
1099 TCollection_ExtendedString GetResource (const TCollection_ExtendedString aFormat,
1100                                         const TCollection_ExtendedString anItem)
1101 {
1102   TCollection_ExtendedString theResource;
1103   theResource+= aFormat;
1104   theResource+= ".";
1105   theResource+= anItem;
1106   return theResource;
1107 }
1108
1109 static void FIND (const Handle(Resource_Manager)& theDocumentResource,
1110                   const TCollection_ExtendedString& theResourceName,
1111                   Standard_Boolean& IsDef,
1112                   TCollection_ExtendedString& theValue)
1113 {
1114   IsDef=UTL::Find(theDocumentResource,theResourceName);
1115   if(IsDef) theValue=UTL::Value(theDocumentResource,theResourceName);
1116   
1117 }
1118
1119 //=======================================================================
1120 //function : StorageResource
1121 //purpose  : 
1122 //=======================================================================
1123
1124 Handle(Resource_Manager) CDM_Document::StorageResource()
1125 {
1126   if(myApplication.IsNull()) {
1127     Standard_SStream aMsg;
1128     aMsg << "this document of format "<< StorageFormat()
1129          << " has not yet been opened by any application. "<< std::endl;
1130     throw Standard_Failure(aMsg.str().c_str());
1131   }
1132   return myApplication->Resources();
1133 }  
1134
1135 //=======================================================================
1136 //function : LoadResources
1137 //purpose  : 
1138 //=======================================================================
1139
1140 void CDM_Document::LoadResources()
1141 {
1142   if(!myResourcesAreLoaded) {
1143     Handle(Resource_Manager) theDocumentResource = StorageResource();
1144  
1145     TCollection_ExtendedString theFormat=StorageFormat(); theFormat+=".";
1146     TCollection_ExtendedString theResourceName;
1147     
1148     theResourceName=theFormat;
1149     theResourceName+="FileExtension";
1150     FIND(theDocumentResource,
1151          theResourceName,myFileExtensionWasFound,myFileExtension);
1152     
1153     theResourceName=theFormat;
1154     theResourceName+="Description";
1155     FIND(theDocumentResource,theResourceName,myDescriptionWasFound,myDescription);
1156     
1157     myResourcesAreLoaded=Standard_True;
1158     
1159 //    std::cout << "resource Loaded: Format: " << theFormat << ", FileExtension:" << myFileExtension << ", Description:" << myDescription << std::endl;
1160   }
1161   return;
1162 }
1163
1164 //=======================================================================
1165 //function : FindFileExtension
1166 //purpose  : 
1167 //=======================================================================
1168
1169 Standard_Boolean CDM_Document::FindFileExtension ()
1170 {
1171   LoadResources();
1172   return myFileExtensionWasFound;
1173 }
1174
1175 //=======================================================================
1176 //function : FileExtension
1177 //purpose  : 
1178 //=======================================================================
1179
1180 TCollection_ExtendedString CDM_Document::FileExtension()
1181 {
1182   LoadResources();
1183   return  myFileExtension;
1184 }
1185
1186 //=======================================================================
1187 //function : FindDescription
1188 //purpose  : 
1189 //=======================================================================
1190
1191 Standard_Boolean CDM_Document::FindDescription ()
1192 {
1193   LoadResources();
1194   return myDescriptionWasFound;
1195 }
1196
1197 //=======================================================================
1198 //function : Description
1199 //purpose  : 
1200 //=======================================================================
1201
1202 TCollection_ExtendedString CDM_Document::Description()
1203 {
1204   LoadResources();
1205   return myDescription;
1206 }
1207
1208 //=======================================================================
1209 //function : IsReadOnly
1210 //purpose  : 
1211 //=======================================================================
1212
1213 Standard_Boolean CDM_Document::IsReadOnly() const
1214 {
1215   if(IsStored()) return myMetaData->IsReadOnly();
1216   return Standard_False;
1217 }
1218
1219 //=======================================================================
1220 //function : IsReadOnly
1221 //purpose  : 
1222 //=======================================================================
1223
1224 Standard_Boolean CDM_Document::IsReadOnly
1225                                 (const Standard_Integer aReferenceIdentifier) const
1226 {
1227   return Reference(aReferenceIdentifier)->IsReadOnly();
1228 }
1229
1230 //=======================================================================
1231 //function : SetIsReadOnly
1232 //purpose  : 
1233 //=======================================================================
1234
1235 void CDM_Document::SetIsReadOnly()
1236 {
1237   if(IsStored()) myMetaData->SetIsReadOnly();
1238 }
1239     
1240 //=======================================================================
1241 //function : UnsetIsReadOnly
1242 //purpose  : 
1243 //=======================================================================
1244
1245 void CDM_Document::UnsetIsReadOnly()
1246 {
1247   if(IsStored()) myMetaData->UnsetIsReadOnly();
1248 }
1249
1250 //=======================================================================
1251 //function : ReferenceCounter
1252 //purpose  : 
1253 //=======================================================================
1254
1255 Standard_Integer CDM_Document::ReferenceCounter() const
1256 {
1257   return myActualReferenceIdentifier;
1258 }
1259
1260 //=======================================================================
1261 //function : SetReferenceCounter
1262 //purpose  : 
1263 //=======================================================================
1264
1265 void CDM_Document::SetReferenceCounter (const Standard_Integer aReferenceCounter)
1266 {
1267   myActualReferenceIdentifier=aReferenceCounter;
1268 }
1269
1270 //=======================================================================
1271 //function : StorageFormatVersion
1272 //purpose  : 
1273 //=======================================================================
1274 Standard_Integer CDM_Document::StorageFormatVersion() const
1275 {
1276   return myStorageFormatVersion;
1277 }
1278
1279 //! 
1280 //=======================================================================
1281 //function : ChangeStorageFormatVersion
1282 //purpose  : Sets <theVersion> of the format to be used to store the document
1283 //=======================================================================
1284 void CDM_Document::ChangeStorageFormatVersion(const Standard_Integer theVersion)
1285 {
1286   myStorageFormatVersion = theVersion;
1287 }
1288
1289 //=======================================================================
1290 //function : DumpJson
1291 //purpose  : 
1292 //=======================================================================
1293 void CDM_Document::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
1294 {
1295   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
1296
1297   for (TColStd_SequenceOfExtendedString::Iterator aCommentIt (myComments); aCommentIt.More(); aCommentIt.Next())
1298   {
1299     const TCollection_ExtendedString& aComment = aCommentIt.Value();
1300     OCCT_DUMP_FIELD_VALUE_STRING (theOStream, aComment)
1301   }
1302   OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myPresentation)
1303   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myValidPresentation)
1304
1305   for (CDM_ListOfReferences::Iterator aFromReferenceIt (myFromReferences); aFromReferenceIt.More(); aFromReferenceIt.Next())
1306   {
1307     const Handle(CDM_Reference)& aFromReference = aFromReferenceIt.Value().get();
1308     OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aFromReference.get())
1309   }
1310
1311   for (CDM_ListOfReferences::Iterator aToReferenceIt (myToReferences); aToReferenceIt.More(); aToReferenceIt.Next())
1312   {
1313     const Handle(CDM_Reference)& aToReference = aToReferenceIt.Value().get();
1314     OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aToReference.get())
1315   }
1316
1317   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myVersion)
1318   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myActualReferenceIdentifier)
1319   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStorageVersion)
1320
1321   OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myMetaData.get())
1322
1323   OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myRequestedComment)
1324   OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myRequestedFolder)
1325   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRequestedFolderIsDefined)
1326   OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myRequestedName)
1327   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRequestedNameIsDefined)
1328   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRequestedPreviousVersionIsDefined)
1329   OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myRequestedPreviousVersion)
1330   OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myFileExtension)
1331   OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myDescription)
1332   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFileExtensionWasFound)
1333   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDescriptionWasFound)
1334
1335   OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myApplication.get())
1336
1337   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStorageFormatVersion)
1338 }