// @(#)root/core:$Id$
// author: Lukasz Janyst <ljanyst@cern.ch>

#ifndef ROOT_TSchemaRuleSet
#define ROOT_TSchemaRuleSet

class TClass;

#include "TObject.h"
#include "TObjArray.h"
#include "Rtypes.h"
#include "TString.h"
#include "TClassRef.h"

namespace ROOT {

   class TSchemaRule;

   class TSchemaMatch: public TObjArray
   {
      public:
         virtual ~TSchemaMatch() {};
         const TSchemaRule* GetRuleWithSource( const TString& name ) const;
         const TSchemaRule* GetRuleWithTarget( const TString& name ) const;
               Bool_t       HasRuleWithSource( const TString& name, Bool_t needingAlloc ) const;
               Bool_t       HasRuleWithTarget( const TString& name, Bool_t willset ) const;
      ClassDef(TSchemaMatch,0);
   };

   class TSchemaRuleSet: public TObject
   {
      public:

         enum EConsistencyCheck {
            kNoCheck       = 0,
            kCheckAll      = 1,
            kCheckConflict = 2
         };

         TSchemaRuleSet();
         virtual ~TSchemaRuleSet();

         Bool_t              AddRule( TSchemaRule* rule, EConsistencyCheck checkConsistency = kCheckAll, TString *errmsg = 0 );
         Bool_t              AddRules( TSchemaRuleSet* rules, EConsistencyCheck checkConsistency = kCheckAll, TString *errmsg = 0);
         Bool_t              HasRuleWithSourceClass( const TString &source) const;
         const TObjArray*    FindRules( const TString &source ) const;
         const TSchemaMatch* FindRules( const TString &source, Int_t version ) const;
         const TSchemaMatch* FindRules( const TString &source, UInt_t checksum ) const;
         const TSchemaMatch* FindRules( const TString &source, Int_t version, UInt_t checksum ) const;
         TClass*             GetClass();
         UInt_t              GetClassCheckSum() const;
         TString             GetClassName() const;
         Int_t               GetClassVersion() const;
         const TObjArray*    GetRules() const;
         const TObjArray*    GetPersistentRules() const;
         void                RemoveRule( TSchemaRule* rule );
         void                RemoveRules( TObjArray* rules );
         void                SetClass( TClass* cls );

         void                ls(Option_t *option="") const;
         void                AsString(TString &out) const;

         ClassDef( TSchemaRuleSet, 1 )

      private:
         TObjArray*                             fPersistentRules; //  Array of the rules that will be embeded in the file
         TObjArray*                             fRemainingRules;  //! Array of non-persisten rules - just for cleanup purposes - owns the elements
         TObjArray*                             fAllRules;        //! Array of all rules
         TClassRef                              fClass;           //! Target class pointer (for consistency checking)
         TString                                fClassName;       //  Target class name
         Int_t                                  fVersion;         //  Target class version
         UInt_t                                 fCheckSum;        //  Target class checksum
   };

} // End of Namespace ROOT

#endif // ROOT_TSchemaRuleSet
 TSchemaRuleSet.h:1
 TSchemaRuleSet.h:2
 TSchemaRuleSet.h:3
 TSchemaRuleSet.h:4
 TSchemaRuleSet.h:5
 TSchemaRuleSet.h:6
 TSchemaRuleSet.h:7
 TSchemaRuleSet.h:8
 TSchemaRuleSet.h:9
 TSchemaRuleSet.h:10
 TSchemaRuleSet.h:11
 TSchemaRuleSet.h:12
 TSchemaRuleSet.h:13
 TSchemaRuleSet.h:14
 TSchemaRuleSet.h:15
 TSchemaRuleSet.h:16
 TSchemaRuleSet.h:17
 TSchemaRuleSet.h:18
 TSchemaRuleSet.h:19
 TSchemaRuleSet.h:20
 TSchemaRuleSet.h:21
 TSchemaRuleSet.h:22
 TSchemaRuleSet.h:23
 TSchemaRuleSet.h:24
 TSchemaRuleSet.h:25
 TSchemaRuleSet.h:26
 TSchemaRuleSet.h:27
 TSchemaRuleSet.h:28
 TSchemaRuleSet.h:29
 TSchemaRuleSet.h:30
 TSchemaRuleSet.h:31
 TSchemaRuleSet.h:32
 TSchemaRuleSet.h:33
 TSchemaRuleSet.h:34
 TSchemaRuleSet.h:35
 TSchemaRuleSet.h:36
 TSchemaRuleSet.h:37
 TSchemaRuleSet.h:38
 TSchemaRuleSet.h:39
 TSchemaRuleSet.h:40
 TSchemaRuleSet.h:41
 TSchemaRuleSet.h:42
 TSchemaRuleSet.h:43
 TSchemaRuleSet.h:44
 TSchemaRuleSet.h:45
 TSchemaRuleSet.h:46
 TSchemaRuleSet.h:47
 TSchemaRuleSet.h:48
 TSchemaRuleSet.h:49
 TSchemaRuleSet.h:50
 TSchemaRuleSet.h:51
 TSchemaRuleSet.h:52
 TSchemaRuleSet.h:53
 TSchemaRuleSet.h:54
 TSchemaRuleSet.h:55
 TSchemaRuleSet.h:56
 TSchemaRuleSet.h:57
 TSchemaRuleSet.h:58
 TSchemaRuleSet.h:59
 TSchemaRuleSet.h:60
 TSchemaRuleSet.h:61
 TSchemaRuleSet.h:62
 TSchemaRuleSet.h:63
 TSchemaRuleSet.h:64
 TSchemaRuleSet.h:65
 TSchemaRuleSet.h:66
 TSchemaRuleSet.h:67
 TSchemaRuleSet.h:68
 TSchemaRuleSet.h:69
 TSchemaRuleSet.h:70
 TSchemaRuleSet.h:71
 TSchemaRuleSet.h:72
 TSchemaRuleSet.h:73
 TSchemaRuleSet.h:74
 TSchemaRuleSet.h:75
 TSchemaRuleSet.h:76
 TSchemaRuleSet.h:77