]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
Added storing of modification deltas to enable optimization of the Object Browser
authorsrn <srn@opencascade.com>
Fri, 29 Jan 2010 07:10:47 +0000 (07:10 +0000)
committersrn <srn@opencascade.com>
Fri, 29 Jan 2010 07:10:47 +0000 (07:10 +0000)
15 files changed:
idl/SALOMEDS.idl
src/SALOMEDS/SALOMEDS_Study.cxx
src/SALOMEDS/SALOMEDS_Study.hxx
src/SALOMEDS/SALOMEDS_Study_i.cxx
src/SALOMEDS/SALOMEDS_Study_i.hxx
src/SALOMEDSClient/SALOMEDSClient_Study.hxx
src/SALOMEDSClient/SALOMEDSClient_definitions.hxx
src/SALOMEDSImpl/Makefile.am
src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.cxx
src/SALOMEDSImpl/SALOMEDSImpl_SObject.cxx
src/SALOMEDSImpl/SALOMEDSImpl_SObject.hxx
src/SALOMEDSImpl/SALOMEDSImpl_Study.cxx
src/SALOMEDSImpl/SALOMEDSImpl_Study.hxx
src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.cxx
src/SALOMEDSImpl/Test/Makefile.am

index 4325a38753b2c29a03fb1b9f732a184984250a1c..6aaea74b3eb90054b49eb99295e6c507df78365a 100644 (file)
@@ -99,6 +99,18 @@ during each working session.
 //! Exception indicating that this feature hasn't been implemented in %SALOME application.
   exception NotImplemented {};
 
+//! Enumeration that describes modifications of the %Study
+  enum DeltaType { DT_NONE, DT_ADDED, DT_REMOVED, DT_MODIFIED };
+
+//! Structure that describes a atomic delta on modification of the %Study
+  struct StudyDelta {
+    string     m_father;
+    string     m_entry;
+    DeltaType  m_type;
+  };
+
+//! A sequence of modification deltas
+  typedef sequence<StudyDelta> ListOfDeltas;
 
   //===========================================================================
  /*! \brief %Study Interface
@@ -404,6 +416,16 @@ during each working session.
 */
     ListOfStrings GetLockerID();
 
+/*! \brief Enable or disable logging of modifications in this Study
+    \param isLogged is a Boolean flag that tells whether modification of the Study is logged.
+*/
+    void SetIsDeltaLogged(in boolean isLogged); 
+
+/*! \brief Returns a list of modification deltas of this Study. Each call of GetLoggedDeltas clears
+     modification deltas stored in this Study.
+*/
+    ListOfDeltas GetLoggedDeltas();
+
 /*! \brief  Create real variable with Name theVarName and value theValue 
 
     (or set if variable value into theValue already exists)
index eeb4c5d33e8999a76fddc183722e677a69a8d7d3..9a5b001b70187093843d0962cbec6f6a37579a50 100644 (file)
@@ -322,66 +322,69 @@ std::string SALOMEDS_Study::GetContext()
 
 std::vector<std::string> SALOMEDS_Study::GetObjectNames(const std::string& theContext)
 {
-  std::vector<std::string> aVector;
+  
   int aLength, i;
   if (_isLocal) {
     SALOMEDS::Locker lock;
-    aVector = _local_impl->GetObjectNames(theContext);
-  }
-  else {
-    SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetObjectNames((char*)theContext.c_str());
-    aLength = aSeq->length();
-    for (i = 0; i < aLength; i++) aVector.push_back(std::string((std::string)aSeq[i].in()));
+    return  _local_impl->GetObjectNames(theContext);
   }
+
+  SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetObjectNames((char*)theContext.c_str());
+  aLength = aSeq->length();
+  std::vector<std::string> aVector(aLength);
+  for (i = 0; i < aLength; i++) aVector[i] = std::string((std::string)aSeq[i].in());
   return aVector;
 }
  
 std::vector<std::string> SALOMEDS_Study::GetDirectoryNames(const std::string& theContext)
 {
-  std::vector<std::string> aVector;
   int aLength, i;
   if (_isLocal) {
     SALOMEDS::Locker lock;
-    aVector = _local_impl->GetDirectoryNames(theContext);
-  }
-  else {
-    SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetDirectoryNames((char*)theContext.c_str());
-    aLength = aSeq->length();
-    for (i = 0; i < aLength; i++) aVector.push_back((char*)aSeq[i].in());
+    return  _local_impl->GetDirectoryNames(theContext);
   }
+
+  SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetDirectoryNames((char*)theContext.c_str());
+  aLength = aSeq->length();
+  std::vector<std::string> aVector(aLength);
+  for (i = 0; i < aLength; i++) aVector[i] = (char*)aSeq[i].in();
+
   return aVector;
 }
  
 std::vector<std::string> SALOMEDS_Study::GetFileNames(const std::string& theContext)
 {
-  std::vector<std::string> aVector;
+  
   int aLength, i;
   if (_isLocal) {
     SALOMEDS::Locker lock;
-    aVector = _local_impl->GetFileNames(theContext);
+    return  _local_impl->GetFileNames(theContext);
   }
-  else {
-    SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetFileNames((char*)theContext.c_str());
-    aLength = aSeq->length();
+  SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetFileNames((char*)theContext.c_str());
+  aLength = aSeq->length();
+  std::vector<std::string> aVector(aLength);
+
+  for (i = 0; i < aLength; i++) aVector[i] = (char*)aSeq[i].in();
 
-    for (i = 0; i < aLength; i++) aVector.push_back((char*)aSeq[i].in());
-  }
   return aVector;
 }
  
 std::vector<std::string> SALOMEDS_Study::GetComponentNames(const std::string& theContext)
 {
-  std::vector<std::string> aVector;
+  
   int aLength, i;
   if (_isLocal) {
     SALOMEDS::Locker lock;
-    aVector = _local_impl->GetComponentNames(theContext);
-  }
-  else {
-    SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetComponentNames((char*)theContext.c_str());
-    aLength = aSeq->length();
-    for (i = 0; i < aLength; i++) aVector.push_back((char*)aSeq[i].in());
+    return _local_impl->GetComponentNames(theContext);
   }
+  SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetComponentNames((char*)theContext.c_str());
+  aLength = aSeq->length();
+  std::vector<std::string> aVector(aLength);
+
+  for (i = 0; i < aLength; i++) aVector[i] = (char*)aSeq[i].in();
+
   return aVector;
 }
 
@@ -584,17 +587,19 @@ std::string SALOMEDS_Study::GetLastModificationDate()
 
 std::vector<std::string> SALOMEDS_Study::GetModificationsDate()
 {
-  std::vector<std::string> aVector;
+  
   int aLength, i;
   if (_isLocal) {
     SALOMEDS::Locker lock;
-    aVector = _local_impl->GetModificationsDate();
-  }
-  else {
-    SALOMEDS::ListOfDates_var aSeq = _corba_impl->GetModificationsDate();
-    aLength = aSeq->length();
-    for (i = 0; i < aLength; i++) aVector.push_back((char*)aSeq[i].in());
+    return _local_impl->GetModificationsDate();
   }
+
+  SALOMEDS::ListOfDates_var aSeq = _corba_impl->GetModificationsDate();
+  aLength = aSeq->length();
+  std::vector<std::string> aVector(aLength);
+
+  for (i = 0; i < aLength; i++) aVector[i] = (char*)aSeq[i].in();
+
   return aVector;
 }
 
@@ -666,20 +671,48 @@ void SALOMEDS_Study::UnLockStudy(const string& theLockerID)
 
 vector<string> SALOMEDS_Study::GetLockerID()
 {
-  std::vector<std::string> aVector;
   int aLength, i;
   if (_isLocal) {
     SALOMEDS::Locker lock;
-    aVector = _local_impl->GetLockerID();
-  }
-  else {
-    SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetLockerID();
-    aLength = aSeq->length();
-    for (i = 0; i < aLength; i++) aVector.push_back((char*)aSeq[i].in());
+    return _local_impl->GetLockerID();
   }
+
+  SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetLockerID();
+  aLength = aSeq->length();
+  std::vector<std::string> aVector(aLength);
+  for (i = 0; i < aLength; i++) aVector[i] = (char*)aSeq[i].in();
+
   return aVector;
 }
 
+void SALOMEDS_Study::SetIsDeltaLogged(bool isLogged)
+{
+  if (_isLocal) {
+    SALOMEDS::Locker lock;
+    _local_impl->SetIsDeltaLogged(isLogged);
+  }
+  else _corba_impl->SetIsDeltaLogged(isLogged);
+}
+
+std::vector< StudyDelta > SALOMEDS_Study::GetLoggedDeltas()
+{
+  if (_isLocal) {
+    SALOMEDS::Locker lock;
+    return _local_impl->GetLoggedDeltas();
+  }
+  
+  SALOMEDS::ListOfDeltas_var aSeq = _corba_impl->GetLoggedDeltas();
+  int aLength = aSeq->length();
+  std::vector< StudyDelta > aVector(aLength);
+  for(int i = 0; i<aLength; i++) {
+
+    const SALOMEDS::StudyDelta& aDelta = aSeq[i];
+    aVector[i] = StudyDelta(aDelta.m_father.in(), aDelta.m_entry.in(), (DeltaOperationType)aDelta.m_type);
+
+  }
+
+  return aVector;
+}
 
 void SALOMEDS_Study::SetReal(const string& theVarName, const double theValue)
 {
@@ -855,17 +888,17 @@ bool SALOMEDS_Study::IsVariable(const string& theVarName)
 
 vector<string> SALOMEDS_Study::GetVariableNames()
 {
-  vector<string> aVector;
   if (_isLocal) {
     SALOMEDS::Locker lock;
-    aVector = _local_impl->GetVariableNames();
-  }
-  else {
-    SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetVariableNames();
-    int aLength = aSeq->length();
-    for (int i = 0; i < aLength; i++) 
-      aVector.push_back( string(aSeq[i].in()) );
+    return _local_impl->GetVariableNames();
   }
+
+  SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetVariableNames();
+  int aLength = aSeq->length();
+  vector<string> aVector(aLength);
+  for (int i = 0; i < aLength; i++) 
+    aVector[i] =  string(aSeq[i].in());
+
   return aVector;
 }
 
@@ -907,22 +940,24 @@ bool SALOMEDS_Study::IsVariableUsed(const string& theVarName)
 
 vector< vector<string> > SALOMEDS_Study::ParseVariables(const string& theVars)
 {
-  vector< vector<string> > aResult;
   if (_isLocal) {
     SALOMEDS::Locker lock;
-    aResult = _local_impl->ParseVariables(theVars);
+    return _local_impl->ParseVariables(theVars);
   }
-  else {
-    SALOMEDS::ListOfListOfStrings_var aSeq = _corba_impl->ParseVariables(theVars.c_str());
-    for (int i = 0, n = aSeq->length(); i < n; i++) {
-      vector<string> aVector;
-      SALOMEDS::ListOfStrings aSection = aSeq[i];
-      for (int j = 0, m = aSection.length(); j < m; j++) {
-        aVector.push_back( string(aSection[j].in()) );
-      }
-      aResult.push_back( aVector );
+
+  SALOMEDS::ListOfListOfStrings_var aSeq = _corba_impl->ParseVariables(theVars.c_str());
+  vector< vector<string> > aResult(aSeq->length());
+  for (int i = 0, n = aSeq->length(); i < n; i++) {
+    
+    SALOMEDS::ListOfStrings aSection = aSeq[i];
+    vector<string> aVector(aSection.length());
+
+    for (int j = 0, m = aSection.length(); j < m; j++) {
+      aVector[j] = string(aSection[j].in());
     }
+    aResult[i] =  aVector;
   }
+
   return aResult;
 }
 
index d99a6c460ac3d9483529783cf01dc0698bebf512..f99f9810a7432a43985d5433af9feb0067e5231f 100644 (file)
@@ -98,6 +98,9 @@ public:
   virtual void UnLockStudy(const std::string& theLockerID);
   virtual std::vector<std::string> GetLockerID();
 
+  virtual void SetIsDeltaLogged(bool isLogged);          
+  virtual std::vector< StudyDelta > GetLoggedDeltas();
+
   virtual void SetReal(const std::string& theVarName, const double theValue);
   virtual void SetInteger(const std::string& theVarName, const int theValue);
   virtual void SetBoolean(const std::string& theVarName, const bool theValue);  
index bf3f7660a38654628999ae6008e2cc6fd62297cd..cfc1f478db3cf3fb7d129ce70746fb1078cb5ed1 100644 (file)
@@ -881,6 +881,43 @@ SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetLockerID()
   }
   return aResult._retn();
 }
+
+//============================================================================
+/*! Function : SetIsDeltaLogged
+ *  Purpose  : 
+ */
+//============================================================================
+void SALOMEDS_Study_i::SetIsDeltaLogged(CORBA::Boolean isLogged)
+{
+  if(isLogged) _impl->SetIsDeltaLogged(true);
+  else _impl->SetIsDeltaLogged(false);
+}
+  
+//============================================================================
+/*! Function : GetLoggedDeltas
+ *  Purpose  : 
+ */
+//============================================================================
+SALOMEDS::ListOfDeltas* SALOMEDS_Study_i::GetLoggedDeltas()
+{
+  const vector< StudyDelta >& aList = _impl->GetLoggedDeltas();
+  SALOMEDS::ListOfDeltas_var aDeltas = new SALOMEDS::ListOfDeltas();
+
+  aDeltas->length(aList.size());
+  for(size_t i = 0, aSize = aList.size(); i<aSize; i++) {
+    const StudyDelta& aD = aList[i];
+
+    SALOMEDS::StudyDelta aDelta;
+    aDelta.m_father = CORBA::string_dup(aD.m_father.c_str());
+    aDelta.m_entry = CORBA::string_dup(aD.m_entry.c_str());
+    aDelta.m_type = (SALOMEDS::DeltaType)aD.m_type;
+
+    aDeltas[i] = aDelta;
+  }
+  
+  return aDeltas._retn();
+}
+
 //============================================================================
 /*! Function : SetReal
  *  Purpose  : 
index 9934e0cde072713177675d55a211ed09ee53e569..c4a544554e90a642cf44847656bc325a6aa2e56c 100644 (file)
@@ -298,6 +298,10 @@ public:
 
   virtual SALOMEDS::ListOfStrings* GetLockerID();
 
+  virtual void SetIsDeltaLogged(CORBA::Boolean isLogged);
+  
+  virtual SALOMEDS::ListOfDeltas* GetLoggedDeltas();
+
   virtual void SetReal(const char* theVarName, CORBA::Double theValue);
   
   virtual void SetInteger(const char* theVarName, CORBA::Long theValue);
index 20f525eb6987b5f94da84518185e227300970a9f..bbb1bd30cea413be3d7f0d14752291085cee7755 100644 (file)
@@ -94,6 +94,9 @@ public:
   virtual void UnLockStudy(const std::string& theLockerID) = 0;
   virtual std::vector<std::string> GetLockerID() = 0;
 
+  virtual void SetIsDeltaLogged(bool isLogged) = 0;          
+  virtual std::vector< StudyDelta > GetLoggedDeltas() = 0;
+
   virtual void SetReal(const std::string& theVarName, const double theValue) = 0;
   virtual void SetInteger(const std::string& theVarName, const int theValue) = 0;
   virtual void SetBoolean(const std::string& theVarName, const bool theValue) = 0;  
index 9d3dc814423d4d9c87863cade03bb7270f03953c..12e7331384821afd9cd845b79e4120152a234d37 100644 (file)
@@ -78,4 +78,25 @@ struct STextColor
     double B;
 };
 
+enum DeltaOperationType { DOT_NONE, DOT_SO_ADDED, DOT_SO_REMOVED, DOT_MODIFIED };
+
+#include <string>
+
+struct StudyDelta {
+  StudyDelta() { m_father = ""; m_entry = ""; m_type = DOT_NONE; }
+  StudyDelta(const std::string& theFather,
+            const std::string& theEntry,
+            DeltaOperationType theOperation) 
+  { 
+    m_father = theFather; 
+    m_entry = theEntry; 
+    m_type = theOperation; 
+  }
+
+  std::string        m_father; //Entry of a father SObject
+  std::string        m_entry;  //Entry of modified SObject
+  DeltaOperationType m_type;   //What operation is performed
+};
+
+
 #endif
index 731cf625a890c36f9e0364e65cea0b227cd75a7d..4d8def016855c616b03dc9cfadce380759ff3dc3 100644 (file)
@@ -96,6 +96,7 @@ COMMON_CPPFLAGS=\
        -I$(srcdir)/../HDFPersist \
        -I$(srcdir)/../DF \
     -I$(srcdir)/../GenericObj \
+    -I$(srcdir)/../SALOMEDSClient \
     -I$(top_builddir)/idl \
        @HDF5_INCLUDES@ \
        @BOOST_CPPFLAGS@ @CORBA_CXXFLAGS@ @CORBA_INCLUDES@
index b1148f59caaf2309d02d406134a429c979d82dfc..35ebfd7556d4c1ca29415d915d061ae5d534a668 100644 (file)
@@ -87,5 +87,10 @@ void SALOMEDSImpl_GenericAttribute::SetModifyFlag()
 
   SALOMEDSImpl_Study* aStudy = SALOMEDSImpl_Study::GetStudy(aLabel);
   if(aStudy) aStudy->Modify();
+  else return;
+
+  if(aStudy->IsDeltaLogged()) { //It's necessary to store in the Study about attributes' modifications
+    aStudy->AddDelta(DF_Label(), aLabel, DOT_MODIFIED);
+  }
 }
 
index 68fa75f94d108d163a2c0f2c24a758e81067e929..790e20354bb23804cc3942dcc27ede560ad0d522 100644 (file)
@@ -239,7 +239,11 @@ string SALOMEDSImpl_SObject::GetIOR() const
   return aStr;
 }
 
-
+//============================================================================
+/*! Function : GetGUID 
+ *  Purpose  : 
+ */
+//============================================================================
 std::string SALOMEDSImpl_SObject::GetGUID(const string& theType) 
 {
   __AttributeTypeToGUIDForSObject
@@ -250,6 +254,42 @@ std::string SALOMEDSImpl_SObject::GetGUID(const string& theType)
   return "";
 }
 
+//============================================================================
+/*! Function : OnAddition
+ *  Purpose  : The method is called after when this SObject is added to the Study
+ */
+//============================================================================
+void SALOMEDSImpl_SObject::OnAddition() const
+{
+  if(_lab.IsNull()) return;
+
+  SALOMEDSImpl_Study* aStudy = GetStudy();
+  if(!aStudy || !aStudy->IsDeltaLogged()) return;
+
+  DF_Label aFather;
+  if(!IsComponent()) aFather = _lab.Father();
+  
+  aStudy->AddDelta(aFather, _lab, DOT_SO_ADDED);
+}
+
+//============================================================================
+/*! Function : OnRemove
+ *  Purpose  : The method is called before when this SObject is removed from the Study
+ */
+//============================================================================
+void SALOMEDSImpl_SObject::OnRemove() const
+{
+  if(_lab.IsNull()) return;
+
+  SALOMEDSImpl_Study* aStudy = GetStudy();
+  if(!aStudy || !aStudy->IsDeltaLogged()) return;
+
+  DF_Label aFather;
+  if(!IsComponent()) aFather = _lab.Father();
+  
+  aStudy->AddDelta(aFather, _lab, DOT_SO_REMOVED);
+}
+
 //============================================================================
 /*! Function :  SALOMEDSImpl_SComponent
  *  Purpose  : 
index 40162ddb3061d49dda4b4aaf0278956061779c89..9501f603932ef1d85b570aebe78215defa2b0aa3 100644 (file)
@@ -72,6 +72,9 @@ public:
 
   virtual DF_Label GetLabel() const { return _lab; }   
 
+  virtual void OnAddition() const;
+  virtual void OnRemove() const;
+
   bool IsNull() const { return _lab.IsNull(); }
 
   bool IsComponent() const;
index d3f93e848f125daa5ae6d4da47ffa9dbbbaeae18..07f3d3b7f7357bdae1ce6c629a3932a1542c430b 100644 (file)
@@ -68,6 +68,7 @@ SALOMEDSImpl_Study::SALOMEDSImpl_Study(const DF_Document* doc,
   _useCaseBuilder = new SALOMEDSImpl_UseCaseBuilder(_doc);
   _builder = new SALOMEDSImpl_StudyBuilder(this);
   _cb = new SALOMEDSImpl_Callback(_useCaseBuilder);
+  _isDelta = false;
   //Put on the root label a StudyHandle attribute to store the address of this object
   //It will be used to retrieve the study object by DF_Label that belongs to the study
   SALOMEDSImpl_StudyHandle::Set(_doc->Main().Root(), this);
@@ -1971,3 +1972,88 @@ vector<string> SALOMEDSImpl_Study::GetIORs()
 
   return anIORs;
 }
+
+//============================================================================
+/*! Function : IsDeltaLogged
+ *  Purpose  :
+ */
+//============================================================================
+bool SALOMEDSImpl_Study::IsDeltaLogged() const
+{
+  return _isDelta;
+}
+
+//============================================================================
+/*! Function : GetLoggedDeltas
+ *  Purpose  :
+ */
+//============================================================================
+vector< StudyDelta > SALOMEDSImpl_Study::GetLoggedDeltas()
+{
+  vector< StudyDelta > aDeltas(_deltas.size());
+
+  map<string, StudyDelta>::const_iterator p = _deltas.begin();
+
+  for(size_t i = 0; p != _deltas.end(); i++, p++) {
+    aDeltas[i] = p->second;
+  } 
+
+  _deltas.clear();
+
+  return aDeltas;
+}
+
+
+//============================================================================
+/*! Function : AddDelta
+ *  Purpose  :
+ */
+//============================================================================
+void SALOMEDSImpl_Study::AddDelta(const DF_Label& theFather, 
+                                 const DF_Label& theObject, 
+                                 DeltaOperationType theOperation)
+{
+  if(theObject.IsNull()) return; 
+  const string& entry = theObject.Entry();
+
+  if(_deltas.find(entry) != _deltas.end()) { //Check whether the object was already modified in any way
+    StudyDelta& aDelta = _deltas[entry];
+
+    switch(aDelta.m_type) {
+    case DOT_SO_ADDED: {
+      switch(theOperation) {
+      case DOT_SO_REMOVED: { _deltas.erase(_deltas.find(entry)); } //Remove delta as the object which has been added is removed
+      default:
+       return;
+      }
+      break;
+    }
+    case DOT_SO_REMOVED: {
+      switch(theOperation) {
+      case DOT_SO_ADDED: {  //The previously removed is again added, modify the delta to MODIFIED
+       aDelta.m_type = DOT_MODIFIED;
+       aDelta.m_father = "";
+      } 
+      default:
+       return;
+      }
+      break;
+    }
+    case DOT_MODIFIED: {
+      switch(theOperation) {
+      case DOT_SO_REMOVED: {  //The previously modified object is removed, keep only the removal delta
+       aDelta.m_type = DOT_SO_REMOVED; 
+       aDelta.m_father = theObject.Father().Entry();
+      } 
+      default:
+       return;
+      }
+      break;
+    }
+    default: return;
+    }
+  }
+  else {
+    _deltas[entry] = StudyDelta(theFather.Entry(), theObject.Entry(), theOperation);
+  }
+}
index 8730cff42457c28fb56ce5c80f01e32671c20fc2..bacb9e794014b09b12d0a170972be1046cb03303 100644 (file)
@@ -36,6 +36,9 @@
 #include "DF_Label.hxx"
 #include <stdio.h>
 
+//SALOMEDSClient headers
+#include "SALOMEDSClient_definitions.hxx"
+
 //SALOMEDSImpl headers
 #include "SALOMEDSImpl_Defines.hxx"
 #include "SALOMEDSImpl_SComponentIterator.hxx"
@@ -53,7 +56,6 @@
 class SALOMEDSImpl_StudyManager;
 class SALOMEDSImpl_GenericAttribute;
 
-
 class SALOMEDSIMPL_EXPORT SALOMEDSImpl_Study
 {
 private:
@@ -69,6 +71,8 @@ private:
   SALOMEDSImpl_Callback*   _cb;
   SALOMEDSImpl_StudyBuilder*   _builder;
   SALOMEDSImpl_UseCaseBuilder* _useCaseBuilder;
+  bool                     _isDelta;
+  std::map<std::string, StudyDelta> _deltas;
 
   std::map<std::string, SALOMEDSImpl_SObject> _mapOfSO;
   std::map<std::string, SALOMEDSImpl_SComponent> _mapOfSCO;
@@ -309,11 +313,29 @@ public:
   //Returns a callback 
   SALOMEDSImpl_Callback* GetCallback() { return _cb; }
 
+  //Enables logging of modifications in SALOME data structure.
+  //Default value is 'false'
+  void SetIsDeltaLogged(bool isLogged) { _isDelta = isLogged; } 
+
+  //Returns true if the study stores a list of modifications related to the SObjects and Attributes 
+  bool IsDeltaLogged() const;    
+
+  //Returns a list of deltas on modifications that happend after the last request of deltas
+  //Note: The request for deltas clears all stored information, so only returned list will contain
+  //      information about modifications
+  std::vector< StudyDelta > GetLoggedDeltas();
+
   //Returns a list of IOR's stored in the study
   std::vector<std::string> GetIORs();
 
+protected:
+
+  //Adds a new Delta to the list of modifications
+  void AddDelta(const DF_Label& theFather, const DF_Label& theObject, DeltaOperationType theOperation);
+
   friend class SALOMEDSImpl_StudyManager;    
   friend class SALOMEDSImpl_GenericAttribute;
   friend class SALOMEDSImpl_GenericVariable;
+  friend class SALOMEDSImpl_SObject;
 };
 #endif
index d09c10e259b3fba754b490e75b2fdfcf6d889b2d..1694348dbf35c44c84ad7cb57e5078cc14245f2c 100644 (file)
@@ -87,9 +87,10 @@ SALOMEDSImpl_SComponent SALOMEDSImpl_StudyBuilder::NewComponent(const string& Da
 
   DF_Label NL = L.NewChild();
 
-  SALOMEDSImpl_AttributeComment::Set(NL, DataType);
-
   SALOMEDSImpl_SComponent so =  _study->GetSComponent (NL);
+  so.OnAddition();
+
+  SALOMEDSImpl_AttributeComment::Set(NL, DataType);
 
   if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
 
@@ -148,6 +149,8 @@ SALOMEDSImpl_SObject SALOMEDSImpl_StudyBuilder::NewObject(const SALOMEDSImpl_SOb
   DF_Label NewLab = Lab.NewChild();
   
   SALOMEDSImpl_SObject so = _study->GetSObject(NewLab);
+  so.OnAddition();
+
   if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
 
   _doc->SetModified(true);  
@@ -171,6 +174,7 @@ SALOMEDSImpl_SObject SALOMEDSImpl_StudyBuilder::NewObjectToTag(const SALOMEDSImp
   DF_Label NewLab = Lab.FindChild(theTag, 1);
 
   SALOMEDSImpl_SObject so = _study->GetSObject(NewLab);
+  so.OnAddition();
 
   if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
 
@@ -191,7 +195,8 @@ bool SALOMEDSImpl_StudyBuilder::RemoveObject(const SALOMEDSImpl_SObject& anObjec
     _errorCode = "Null object";
     return false;
   }
-
+  
+  anObject.OnRemove();
   if(_callbackOnRemove) _callbackOnRemove->OnRemoveSObject(anObject);
 
   DF_Label Lab = anObject.GetLabel();
@@ -229,6 +234,7 @@ bool SALOMEDSImpl_StudyBuilder::RemoveObjectWithChildren(const SALOMEDSImpl_SObj
     return false;
   }
 
+  anObject.OnRemove();
   if(_callbackOnRemove) _callbackOnRemove->OnRemoveSObject(anObject);
 
   DF_Label Lab = anObject.GetLabel();
@@ -247,6 +253,10 @@ bool SALOMEDSImpl_StudyBuilder::RemoveObjectWithChildren(const SALOMEDSImpl_SObj
   DF_ChildIterator it(Lab, true);
   for(;it.More();it.Next()) {
     DF_Label aLabel = it.Value();
+
+    SALOMEDSImpl_SObject so(aLabel);
+    so.OnRemove();
+
     if ((aReference=(SALOMEDSImpl_AttributeReference*)aLabel.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
       SALOMEDSImpl_AttributeTarget* aTarget = NULL;
       if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
index 348d2c7c9c85b2e9877e08d44b3555a6d31762c3..8a4983c3bfceeebf3efef602a2b7841732036979 100644 (file)
@@ -57,6 +57,7 @@ COMMON_CPPFLAGS=\
        -I$(srcdir)/$(RPATH)/ResourcesManager \
        -I$(srcdir)/$(RPATH)/LifeCycleCORBA \
        -I$(srcdir)/$(RPATH)/DF \
+       -I$(srcdir)/$(RPATH)/SALOMEDSClient \
        -I$(srcdir)/$(RPATH)/SALOMEDSImpl \
        -I$(top_builddir)/idl \
        @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ @BOOST_CPPFLAGS@