00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef XSynchronActionH
00047 #define XSynchronActionH
00048
00049 #include <zeusbase/System/Interfaces/IXObject.hpp>
00050 #include <zeusbase/System/Interfaces/IXSynchronAction.hpp>
00051 #include <zeusbase/System/ZObject.h>
00052 #include <zeusbase/System/ManagedList.hpp>
00053 #include <zeusbase/System/Set.hpp>
00054
00055
00056 BEGIN_NAMESPACE_Zeus
00057
00058
00062
00063 zeusbase_class TXSynchronAction : public TZObject, public IXSynchronAction
00064 {
00065 public:
00066 TXSynchronAction(IXObject* pNode1, IXObject* pNode2, ENodeActionType actionType = IXSynchronAction::etNodeUnchanged);
00067 TXSynchronAction(IXObject* pNode1, IXObject* pNode2, IXSynchronAction* pParent, ENodeActionType actionType = IXSynchronAction::etNodeUnchanged);
00068
00069 static bool isNodeEqual(IXMLNode& pSource,
00070 IXMLNode& rTarget,
00071 bool bRecurs = true);
00072 static bool isNodeEqual(IXMLNode& pSource,
00073 IXMLNode& rTarget,
00074 const TSet<TString>& rExcludedAttributes,
00075 bool bRecurs = true);
00076
00077
00078 virtual Retval MQUALIFIER addNewChild(IXObject* pNode1, IXObject* pNode2, IXSynchronAction::ENodeActionType mType, IXSynchronAction*& pChild);
00079 virtual void MQUALIFIER add(IXSynchronAction& pChild);
00080 virtual Retval MQUALIFIER getNextChildOfAction(IXSynchronAction& rRefChild, IXSynchronAction*& rpNextChild);
00081 virtual Int MQUALIFIER getCount() const ;
00082 virtual Retval MQUALIFIER getChild(Int iIndex, IXSynchronAction*& pAction) const;
00083 virtual ENodeActionType MQUALIFIER getType() const;
00084 virtual Retval MQUALIFIER getNode1(IXObject*& pNode) const;
00085 virtual Retval MQUALIFIER getNode2(IXObject*& pNode) const;
00086 virtual Retval MQUALIFIER getParent(IXSynchronAction*& pParent) const;
00087 virtual void MQUALIFIER setParent(IXSynchronAction& pParent);
00088 virtual void MQUALIFIER disable();
00089 virtual void MQUALIFIER enable();
00090 virtual bool MQUALIFIER isEnabled() const { return m_bEnabled; }
00091 virtual Retval MQUALIFIER executeAction(long lCycleCount=0, bool bUnfreeze = false, bool bCleanTree = false, IXSynchronActionListener* pListener = NULL);
00092 virtual void MQUALIFIER getCaption(IString& rCaption) const;
00093 virtual Retval MQUALIFIER findAction(IXObject& rObject, IXSynchronAction*& rpAction);
00094 virtual Int MQUALIFIER getSubActionCount() const;
00095 virtual Retval MQUALIFIER getErrorCode() const;
00096 virtual Retval MQUALIFIER checkPreConditions(Int iCycleID = 0, bool bForce = false);
00097 virtual void MQUALIFIER setRootObjectNotification(bool bFlag);
00098 virtual Retval MQUALIFIER getRootAction(IXSynchronAction*& rpRoot) const;
00099
00100
00101 MEMORY_MANAGER_DECL
00102
00103 protected:
00105 TManagedList<IXSynchronAction> m_lstChildren;
00107 bool m_bRootObjectNotification;
00108
00109 virtual ~TXSynchronAction();
00110
00111
00112 virtual Retval MQUALIFIER executeRecurs(Int iActCylceID, IXSynchronActionListener* pListener = NULL);
00113 virtual void MQUALIFIER finishRecurs();
00114 virtual void MQUALIFIER cleanTargetTree();
00115
00116
00122
00123 virtual void onStartExecuting(bool& rAbort) { rAbort = false; }
00124
00125
00132
00133 virtual void onExecuted(bool , bool& rAbort) { rAbort = false; }
00134
00135
00141
00142 virtual void onPostProcessing(bool ) {}
00143
00144 bool isRootOfExecution();
00145 bool canUnfreeze();
00146 bool canCleanTree();
00147 void setErrorCode(Retval retErrorCode);
00148
00149
00150 private:
00152 bool m_bEnabled;
00154 IXObject* m_pNode1;
00156 IXObject* m_pNode2;
00158 ENodeActionType m_NodeActionType;
00160 IXSynchronAction* m_pParent;
00162 bool m_bRootOfExecution;
00164 bool m_bUnfreeze;
00166 bool m_bCleanTree;
00168 Retval m_retErrorCode;
00169
00170 Retval performchanges();
00171 Retval addNewXObject();
00172 Retval removeXObject();
00173
00174 void synchronizeAttributes(IXMLNode& rXMLNode1, IXMLNode& rXMLNode2);
00175 void synchronizeSubNodes(IXMLNode& rXMLNode1, IXMLNode& rXMLNode2);
00176
00177 static bool isXObject(IXMLNode& pNode);
00178
00179 void notifySynchronizeStarted();
00180 void notifySynchronizeEnded();
00181 void notifySynchronizeCycleFinished(Int iActCycleID);
00182 };
00183
00184
00185
00190
00191 inline bool TXSynchronAction::isRootOfExecution()
00192 {
00193 return m_bRootOfExecution;
00194 }
00195
00196
00199
00200 inline bool TXSynchronAction::canUnfreeze()
00201 {
00202 return m_bUnfreeze;
00203 }
00204
00205
00208
00209 inline bool TXSynchronAction::canCleanTree()
00210 {
00211 return m_bCleanTree;
00212 }
00213
00214
00215
00218
00219 inline void TXSynchronAction::setErrorCode(Retval retErrorCode)
00220 {
00221 if (retErrorCode != RET_NOERROR)
00222 {
00223 m_retErrorCode = retErrorCode;
00224 m_NodeActionType = etNodeError;
00225 }
00226 }
00227
00228
00231
00232 inline void MQUALIFIER TXSynchronAction::setRootObjectNotification(bool bFlag)
00233 {
00234 m_bRootObjectNotification = bFlag;
00235 }
00236
00237
00240
00241 inline bool TXSynchronAction::isNodeEqual(IXMLNode& pSource,
00242 IXMLNode& rTarget,
00243 bool bRecurs )
00244 {
00245 TSet<TString> setEmpty;
00246 return TXSynchronAction::isNodeEqual(pSource, rTarget, setEmpty, bRecurs);
00247 }
00248
00249 END_NAMESPACE_Zeus
00250
00251 #endif
00252